iT邦幫忙

2025 iThome 鐵人賽

DAY 30
0
自我挑戰組

安豬複習系列 第 30

#29

  • 分享至 

  • xImage
  •  

Keystore 與加密 Framework — Android 的安全核心

intro: why Android need Keystore?

在 Android 系統中,安全性與隱私保護是設計的關鍵考量。
應用程式(App)常需要保存敏感資料,例如:

  • 使用者的登入密鑰(Access Token)
  • 支付憑證(Payment Credential)
  • 加密金鑰(Encryption Key)
  • 生物辨識驗證結果(Fingerprint / Face)
    如果應用直接將金鑰儲存在應用內部(例如 SharedPreferences 或檔案系統),一旦裝置被 Root、破解或 Debug,就可能導致私鑰洩漏,進而危及用戶安全。
    因此,Android 自 4.3(API 18)開始引入 Keystore 系統,提供:一個安全、隔離、可控的金鑰管理與加密運算框架

Keystore 架構概覽

Android Keystore 是 Android Security Framework 的核心之一,它負責:

  • 安全地產生、儲存與使用金鑰;
  • 在不暴露私鑰的情況下進行加解密或簽章;
  • 與硬體安全模組(TEE / StrongBox)整合;
  • 提供應用層的安全 API。
+---------------------------------------------------------------+
|                      Android Security Stack                   |
|---------------------------------------------------------------|
|  Application Layer (Java/Kotlin API)                          |
|    └── android.security.keystore.KeyStore, KeyGenParameterSpec|
|                                                               |
|  Framework Layer                                               |
|    └── Keystore Service (Binder IPC, system_server)           |
|                                                               |
|  Native Layer                                                  |
|    └── Keymaster HAL (Keymaster 3.0/4.0/4.1)                  |
|                                                               |
|  Hardware Layer                                                |
|    └── TEE / StrongBox / HSM (Hardware-backed Keystore)       |
+---------------------------------------------------------------+

三、Keystore 的工作流程
Android Keystore 的整體運作可分為五個階段:

  1. 金鑰產生 (Key Generation)
    應用程式透過 KeyGenerator 或 KeyPairGenerator 建立金鑰。
    這些金鑰可以指定屬性,例如:
  • 是否允許匯出;
  • 是否需要使用者認證;
  • 使用範圍(如僅限簽章或加解密)。
  • Ex.
val keyGen = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
val spec = KeyGenParameterSpec.Builder(
    "mySecretKey",
    KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
    .setUserAuthenticationRequired(true)
    .build()

keyGen.init(spec)
keyGen.generateKey()
  1. 金鑰儲存 (Key Storage)
    產生的金鑰會自動存放在 Android Keystore 中,而非應用檔案系統。
    金鑰實體會以「不可匯出」的形式存在:
  • 若硬體支援,金鑰存於 TEE (Trusted Execution Environment) 或 StrongBox;
  • 若裝置無硬體支援,則採用軟體加密儲存於 /data/misc/keystore/。
    金鑰實際上並不會離開 Keystore 模組,即使應用擁有金鑰別名(alias),也只能透過 Keystore API 進行操作。
  1. 金鑰使用 (Key Usage)
    Application 可使用 Keystore 進行:
  • 加密/解密(Encrypt/Decrypt)
  • 簽章/驗章(Sign/Verify)
  • 金鑰包裝(Key Wrapping)
    在此過程中,私鑰永遠不會被匯出至應用層,只會在 Keystore 模組內完成運算。
  1. 金鑰驗證 (Authentication)
    Keystore 支援與生物辨識 / PIN / Pattern 等安全機制綁定:
    Ex.
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(30)

代表金鑰只能在使用者通過身份驗證後的 30 秒內使用。

  1. 金鑰移除與生命週期管理
  • 可透過 keyStore.deleteEntry("alias") 刪除;
  • 系統在應用解除安裝時會自動清理該應用的 Keystore 資料;
  • 在企業管理(Device Policy)下可受遠端管理(如鎖定或銷毀)。

底層支撐:Keymaster HAL 與 StrongBox

Keymaster HAL

Keymaster(Key Management Service HAL)是 Android Framework 與硬體安全的橋樑。它提供以下功能:

  • 金鑰產生與簽章;
  • 加密演算法支援(AES、RSA、ECDSA 等);
  • 硬體身份驗證(Hardware Attestation)。

版本演進:

版本 Android 版本 新功能
v1.0 Android 4.3 基本金鑰管理
v3.0 Android 8.0 與 TEE 整合
v4.0 Android 9.0 支援 StrongBox
v4.1 Android 11 改進 attestation 與 rollback 保護

StrongBox Keymaster

StrongBox 是獨立於 TEE 的硬體安全元件(如 Titan M、Secure Element)。它能提供更高安全等級的金鑰保護與防回滾機制。
比較表:

項目 TEE-backed Keystore StrongBox-backed Keystore
實現方式 SoC 內部安全區域 獨立安全晶片
安全等級 極高
可抵抗攻擊 軟體層、Root 攻擊 實體與側信道攻擊
適用場景 一般應用 金融、支付、安全認證

加密 API 層設計:AndroidKeyStore Provider

Android 在 Java 層提供統一的 Provider:
Provider: AndroidKeyStore
應用程式可透過標準 javax.crypto 或 java.security API 使用:

類別 功能
KeyStore 存取金鑰條目
KeyGenerator 產生對稱金鑰
KeyPairGenerator 產生非對稱金鑰
Cipher 加密與解密
Signature 數位簽章
KeyInfo 查詢金鑰屬性

安全特性與限制

安全特性

  • 金鑰不可匯出;
  • 支援硬體加密;
  • 支援生物辨識綁定;
  • 支援 rollback protection;
  • 支援 attestation 簽章。

限制

  • 無法在不同 App 間共用金鑰;
  • 不支援所有演算法(取決於硬體);
  • 金鑰需依用途與模式嚴格指定;
  • 無法跨裝置遷移。

use cases

  1. AES 加密檔案
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
cipher.init(Cipher.ENCRYPT_MODE, secretKey)

val encryptedData = cipher.doFinal(plainText)
val iv = cipher.iv
  1. 使用 RSA 進行簽章
val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
val privateKey = keyStore.getKey("myKeyAlias", null) as PrivateKey

val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey)
signature.update(data)
val signedData = signature.sign()

3.生物辨識與金鑰結合
結合 BiometricPrompt,確保只有本人操作可觸發加密運算。

Keystore 在系統安全中的角色

Keystore 並非孤立存在,它與 Android 的整體安全模型緊密結合:

+-------------------------------------------------------------+
|                 Android Security Architecture               |
|-------------------------------------------------------------|
| App Sandbox  | PermissionManager | SELinux | Verified Boot   |
|-------------------------------------------------------------|
|              Keystore / Keymaster / StrongBox               |
+-------------------------------------------------------------+
  • SELinux:保護 Keystore Service 不被未授權進程存取;
  • Verified Boot:防止金鑰在開機階段被替換;
  • PermissionManager:限制應用對金鑰的使用權;
  • TEE / StrongBox:保證私鑰安全儲存與運算。

未來趨勢與新方向

隨著 Android 版本演進,Google 持續加強 Keystore 的功能:

  • Android 12 引入 Auth-bound keys;
  • Android 13 支援 Hardware-enforced User ID;
  • Android 14 改進 Key attestation APIs;
  • 未來預期支援 Remote Key Provisioning (RKP)。
    • RKP 讓金鑰可由雲端安全服務生成並分發,提升裝置安全一致性。

summary

關鍵概念 說明
Keystore Android 的金鑰管理框架,確保金鑰安全使用
Keymaster 介於 Framework 與硬體安全模組的 HAL 層
StrongBox 硬體級安全儲存區,防範物理攻擊
API 使用 透過 KeyStore, Cipher, Signature 等標準 API
生物認證整合 可與指紋 / 臉部解鎖綁定金鑰使用權限
安全保證 金鑰永不離開 Keystore,受硬體保護與系統策略約束

Keystore 是 Android 安全的最後防線
Keystore 不僅僅是一個加密 API,它是 Android 整體安全生態的核心元件。
它確保金鑰的全生命週期安全,從產生、儲存、使用、到銷毀,都受到嚴格控制。
對於開發者而言,善用 Keystore 不只是「安全最佳實踐」,更是保護用戶信任的根本。


上一篇
#28
下一篇
#30
系列文
安豬複習31
  1. 27
    #26
  2. 28
    #27
  3. 29
    #28
  4. 30
    #29
  5. 31
    #30
完整目錄
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言